﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Sped.Sped
{
    /// <summary>
    /// REGISTRO C170: CO MPLEMENTO DO DOCUMENTO - ITENS DO DOCUMENTO (CÓDIGOS 01, 1B, 04 e 55)
    /// </summary>
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("SpedPisCofins.RegC170")]
    [ComVisible(true)]
    public class RegC170 : IBloco
    {
        /// <summary>
        /// Número seqüencial do item no documento fiscal
        /// </summary>
        public string NUM_ITEM {get; set;}
        /// <summary>
        /// Código do item (campo 02 do Registro 0200)
        /// </summary>
        public string COD_ITEM {get; set;}
        /// <summary>
        /// Descrição complementar do item como adotado no documento fiscal
        /// </summary>
        public string DESCR_COMPL { get; set; }
        /// <summary>
        /// Quantidade do item
        /// </summary>
        public double QTD { get; set; }
        /// <summary>
        /// Unidade do item (Campo 02 do registro 0190)
        /// </summary>
        public string UNID { get; set; }
        /// <summary>
        /// Valor total do item (mercadorias ou serviços)
        /// </summary>
        public double VL_ITEM { get; set; }
        /// <summary>
        /// Valor do desconto comercial
        /// </summary>
        public double VL_DESC { get; set; }
        /// <summary>
        /// Movimentação física do ITEM/PRODUTO:
        ///     0. SIM
        ///     1. NÃO
        /// </summary>
        public string IND_MOV { get; set; }
        /// <summary>
        /// Código da Situação Tributária referente ao ICMS, conforme a Tabela indicada no item 4.3.1
        /// </summary>
        public string CST_ICMS { get; set; }
        /// <summary>
        /// Código Fiscal de Operação e Prestação
        /// </summary>
        public string CFOP { get; set; }
        /// <summary>
        /// Código da natureza da operação (campo 02 do Registro 0400)
        /// </summary>
        public string COD_NAT { get; set; }
        /// <summary>
        /// Valor da base de cálculo do ICMS
        /// </summary>
        public double VL_BC_ICMS { get; set; }
        /// <summary>
        /// Alíquota do ICMS
        /// </summary>
        public double ALIQ_ICMS { get; set; }
        /// <summary>
        /// Valor do ICMS creditado/debitado
        /// </summary>
        public double VL_ICMS { get; set; }
        /// <summary>
        /// Valor da base de cálculo referente à substituição tributária
        /// </summary>
        public double VL_BC_ICMS_ST { get; set; }
        /// <summary>
        /// Alíquota do ICMS da substituição tributária na unidade da federação de destino
        /// </summary>
        public double ALIQ_ST { get; set; }
        /// <summary>
        /// Alíquota do ICMS da substituição tributária na unidade da federação de destino
        /// </summary>
        public double VL_ICMS_ST { get; set; }
        /// <summary>
        /// Valor do ICMS referente à substituição tributária
        /// </summary>
        public string IND_APUR { get; set; }
        /// <summary>
        /// Indicador de período de apuração do IPI:
        ///     0 - Mensal;
        ///     1 Decendial
        /// </summary>
        public string CST_IPI { get; set; }
        /// <summary>
        /// Código da Situação Tributária referente ao IPI, conforme a Tabela
        /// indicada no item 4.3.2.
        /// </summary>
        public string COD_ENQ { get; set; }
        /// <summary>
        /// Valor da base de cálculo do IPI
        /// </summary>
        public double VL_BC_IPI { get; set; }
        /// <summary>
        /// Alíquota do IPI 
        /// </summary>
        public double ALIQ_IPI { get; set; }
        /// <summary>
        /// Valor do IPI creditado/debitado
        /// </summary>
        public double VL_IPI { get; set; }
        /// <summary>
        /// Código da Situação Tributária referente ao PIS
        /// </summary>
        public string CST_PIS { get; set; }
        /// <summary>
        ///  Alíquota do PIS (em percentual)
        /// </summary>
        public double ALIQ_PIS { get; set; }
        /// <summary>
        /// Valor da base de cálculo do PIS
        /// </summary>
        public double VL_BC_PIS { get; set; }
        /// <summary>
        /// Quantidade – Base de cálculo PIS/PASEP
        /// </summary>
        public double QUANT_BC_PIS { get; set; }
        /// <summary>
        /// Alíquota do PIS (em reais)
        /// </summary>
        public double ALIQ_PIS_QUANT { get; set; }
        /// <summary>
        /// Valor do PIS
        /// </summary>
        public double VL_PIS { get; set; }
        /// <summary>
        /// Código da Situação Tributária referente ao COFINS
        /// </summary>
        public string CST_COFINS { get; set; }
        /// <summary>
        /// alor da base de cálculo da COFINS
        /// </summary>
        public double VL_BC_COFINS { get; set; }
        /// <summary>
        /// Alíquota do COFINS (em percentual)
        /// </summary>
        public double ALIQ_COFINS { get; set; }
        /// <summary>
        /// Quantidade – Base de cálculo COFINS
        /// </summary>
        public double QUANT_BC_COFINS { get; set; }
        /// <summary>
        /// Alíquota da COFINS (em reais)
        /// </summary>
        public double ALIQ_COFINS_QUANT { get; set; }
        /// <summary>
        /// Valor da COFINS
        /// </summary>
        public double VL_COFINS { get; set; }
        /// <summary>
        /// Código da conta analítica contábil debitada/creditada
        /// </summary>
        public string COD_CTA { get; set; }

        public override bool ValidaRegistro(ref string Erro)
        {
            var ValidacaoOK = true;
            Erro = "";

            if (string.IsNullOrEmpty(this.NUM_ITEM))
            {
                this.NUM_ITEM = string.Empty;
                Erro += "\r\n* Registro C170 - Número seqüencial do item no documento fiscal não informado.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.COD_ITEM))
            {
                this.COD_ITEM = string.Empty;
                Erro += "\r\n* Registro C170 - Código do item (campo 02 do Registro 0200) não informado.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.DESCR_COMPL))
                this.DESCR_COMPL = string.Empty;

            if (string.IsNullOrEmpty(this.UNID))
                this.UNID = string.Empty;

            if (!double.IsNaN(this.VL_ITEM) || this.VL_ITEM <= 0)
            {
                this.VL_ITEM = 0;
                Erro += "\r\n* Registro C170 - Valor total do item (mercadorias ou serviços) não informado ou inválido.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.IND_MOV) || this.IND_MOV.StringIN("0-1"))
            {
                Erro += "\r\n* Registro C170 - Movimentação física do Item não informado ou inválido.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.CST_ICMS))
                this.CST_ICMS = string.Empty;

            if (string.IsNullOrEmpty(this.CFOP))
            {
                this.CFOP = string.Empty;
                Erro += "\r\n* Registro C170 - CFOP não informado ou inválido.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.IND_APUR) || this.IND_APUR.StringIN("0-1"))
            {
                Erro += "\r\n* Registro C170 -Indicador de período de apuração do IPI não informado ou inválido.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.CST_IPI))
                this.CST_IPI = string.Empty;

            if (string.IsNullOrEmpty(this.COD_ENQ))
                this.COD_ENQ = string.Empty;

            if (string.IsNullOrEmpty(this.CST_PIS))
            {
                this.CST_PIS = string.Empty;
                Erro += "\r\n* Registro C170 - CST do PIS não informado ou inválido.";
                ValidacaoOK = false;
            }
            
            if (string.IsNullOrEmpty(this.CST_COFINS))
            {
                this.CST_COFINS = string.Empty;
                Erro += "\r\n* Registro C170 - CST do COFINS não informado ou inválido.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(COD_CTA))
                this.COD_CTA = string.Empty;

            return ValidacaoOK;
        }

        public override string Layout()
        {
            var Linha = string.Empty;

            Linha += "C170" + this.Delimitador;
            Linha += this.NUM_ITEM.ToString().Trim() + this.Delimitador;
            Linha += this.COD_ITEM.ToString().Trim() + this.Delimitador;
            Linha += this.DESCR_COMPL.ToString().removeFormatacao().Trim() + this.Delimitador;
            Linha += this.QTD.FormatoValorSped(5) + this.Delimitador;
            Linha += this.UNID.ToString().Trim() + this.Delimitador;
            Linha += this.VL_ITEM.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.VL_DESC.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.IND_MOV.ToString().Trim() + this.Delimitador;
            Linha += this.CST_ICMS.ToString().Trim() + this.Delimitador;            
            Linha += this.VL_DESC.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.CFOP.ToString().Trim() + this.Delimitador;
            Linha += this.COD_NAT.ToString().Trim() + this.Delimitador;
            Linha += this.VL_BC_ICMS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.ALIQ_ICMS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.VL_ICMS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.VL_BC_ICMS_ST.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.ALIQ_ST.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.VL_ICMS_ST.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.IND_APUR.ToString().Trim() + this.Delimitador;
            Linha += this.CST_IPI.ToString().Trim() + this.Delimitador;
            Linha += this.COD_ENQ.ToString().Trim() + this.Delimitador;
            Linha += this.VL_BC_IPI.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.ALIQ_IPI.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.VL_IPI.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.CST_PIS.ToString().Trim() + this.Delimitador;
            Linha += this.VL_BC_PIS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.ALIQ_PIS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.QUANT_BC_PIS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.ALIQ_PIS_QUANT.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.VL_PIS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.CST_COFINS.ToString().Trim() + this.Delimitador;
            Linha += this.VL_BC_COFINS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.ALIQ_COFINS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.QUANT_BC_COFINS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.ALIQ_COFINS_QUANT.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.VL_COFINS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.COD_CTA.ToString().Trim() + this.Delimitador;

            return Linha.Trim(); 
        }
    }
}
